package com.kuaiyin.result;

import lombok.Data;

import java.io.Serializable;
import java.util.Collections;

/**
 * 统一API响应格式封装
 *
 * @param <T> 泛型数据类型（无数据时自动返回空对象{}）
 */
@Data
public class Result<T> implements Serializable {
    private Integer code;  // 状态码：1成功 0失败
    private String msg;    // 提示信息（默认"success"）
    private T data;        // 响应数据（无数据时返回空对象）

    //---------------- 成功响应构造方法 ----------------//

    /**
     * 基础成功响应（无数据）
     *
     * @return code=1, msg="success", data={}
     */
    public static <T> Result<T> success() {
        return build(1, "success", emptyData());
    }

    /**
     * 自定义消息的成功响应
     *
     * @param msg 提示消息
     * @return code=1, 自定义msg, data={}
     */
    public static <T> Result<T> success(String msg) {
        return build(1, msg, emptyData());
    }

    /**
     * 带数据的成功响应
     *
     * @param data 业务数据（为null时自动转为{}）
     * @return code=1, msg="success", 业务数据
     */
    public static <T> Result<T> success(T data) {
        return build(1, "success", data != null ? data : emptyData());
    }

    /**
     * 完整成功响应
     *
     * @param msg  提示消息
     * @param data 业务数据（为null时自动转为{}）
     * @return code=1, 自定义msg, 业务数据
     */
    public static <T> Result<T> success(String msg, T data) {
        return build(1, msg, data != null ? data : emptyData());
    }

    //---------------- 错误响应构造方法 ----------------//

    /**
     * 错误响应
     *
     * @param msg  错误提示消息（必填）
     * @return code=0, 错误msg, data={}
     */
    public static <T> Result<T> error(String msg) {
        return error(0, msg); // 不传code时默认0
    }

    public static <T> Result<T> error(int code, String msg) {
        return build(code, msg, emptyData());
    }

    public static <T> Result<T> error(int code, String msg, T data) {
        return build(code, msg, data != null ? data : emptyData());
    }

    //---------------- 私有工具方法 ----------------//

    /**
     * 构造基础响应对象
     */
    private static <T> Result<T> build(int code, String msg, T data) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 生成空数据对象（泛型安全）
     */
    @SuppressWarnings("unchecked")
    private static <T> T emptyData() {
        return (T) Collections.emptyMap(); // 返回{}
    }
}
